Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Πρόβλημα με υποδιαστολή

Îåêßíçóå áðü ôï ìÝëïò AlKiS. Τελευταία δημοσίευση από το μέλος AlKiS στις 31-01-2012, 01:00. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  30-01-2012, 13:45 69073

    Πρόβλημα με υποδιαστολή

    Καλησπέρα σε όλους :)


    Έχω ένα πρόβλημα με την υποδιαστολή... Ακούστε τι έγινε..

    Έχω αγγλικά windows οπότε τα region and language settings είναι σε αγγλικά (Ηνωμένου Βασιλείου). το κόμμα (υποδιαστολή) είναι η ελληνική τελεία, και σε όλα τα αρχεία μαθηματικών που έκανα import ισχύει το ίδιο φυσικά

    Όμως όταν έδωσα το πρόγραμμα στον καθηγητή μου να το τρέξει, αυτός έχει Ελληνικά windows, και αντί να του βγάζει πχ 0.0880000 του έβγαλε 880000. δλδ απο 0.κάτι πήγε σε χιλιάδες!!

    Θέλω ένα τρόπο έτσι ώστε να βλέπω πιο σύμβολο χρησιμοποιείτε σαν υποδιαστολή στα εκάστοτε Windows, για να γράψω μετά κώδικα που θα μετατρέπει τα πάντα σε αυτό το σύμβολο (πχ αν κάνε ένα dataset ένας Έλληνας, και βάλει για υποδιαστολή το κόμμα, να γράψω .replace(",",{Windows.Comma.Default}) όπου το  {Windows.Comma.Default} θα είναι η εκάστοτε υποδιαστολή που χρησιμοποιεί κάθε windows. 


  •  30-01-2012, 15:07 69074 σε απάντηση της 69073

    Απ: Πρόβλημα με υποδιαστολή

    Imports System.Threading

    Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator

  •  30-01-2012, 18:03 69077 σε απάντηση της 69074

    Απ: Πρόβλημα με υποδιαστολή

    Δεν υπάρχει κανένας (σχεδόν) λόγος να ψάχνεις ποιό είναι το Decimal ή το Thousand separator αν δεν κάνεις "καρφωτές" μετατρέπες από αριθμό σε κείμενο ή το αντίστροφο. Στα σημεία που γίνονται τέτοιες μετατροπές (π.χ. σε μία φόρμα ή όταν γράφεις/διαβάζεις από ένα αρχείο) τα Windows θα χρησιμοποιήσουν αυτόματα τις επιλογές που έχει κάνει ο χρήστης στο Regional Settings. 

    Θα πρέπει να μας πεις σε ποιά ακριβώς περίπτωση εμφανίστηκε το πρόβλημα στη μετατροπή: Έγραψες σε αρχείο, στη βάση, εμφάνισες τιμή στην οθόνη, διάβασες τιμή από την οθόνη? Έχεις κάπου ένα αρχείο με "καρφωτά" δεδομένα?

    Είναι πολύ σημαντικό να καταλάβεις τί συμβαίνει και να μην προσπαθήσεις να μαντέψεις δεκαδικά και χιλιάδες ΣΕ ΚΑΜΜΙΑ ΑΠΟΛΥΤΩΣ ΠΕΡΙΠΤΩΣΗ γιατί η οποιαδήποτε "λύση" θα σκάσει μόλις η εφαρμογή τρέξει σε μηχάνημα με άλλες ρυθμίσεις. Η ελληνική αγορά είναι γεμάτη από εφαρμογές που ... δεν παίζουν με ελληνικά παρά μόνο στις 29 Φεβρουαρίου και Πανσέληνο.

    Γενικά τώρα, θα πρέπει να προσέξεις τα εξής:
    • Αν διαβάζεις ή γράφεις σε βάση δεν θα έχεις ποτέ πρόβλημα αν αποθηκεύεις τους αριθμούς σε αριθμητικά πεδία και χρησιμοποιείς parameterized queries για τα select, update. Προφανώς, αν δεν αναγκάσεις με το στανιό να γίνει μετατροπή αριθμού σε κείμενο, δεν θα έχεις ποτέ πρόβλημα. 
      Σε αυτό το σημείο την πατάνε πολλοί έλληνες προγραμματιστές, επειδή φτιάχνουν "καρφωτά" SQL statements προκαλώντας, χωρίς να το καταλάβουν, μετατροπές με βάση το user locale.
    • Ομοίως, αν χρησιμοποιείς datasets θα πρέπει να βεβαιωθείς ότι τα αριθμητικά πεδία είναι όντως αριθμητικά και όχι κείμενο
    • Όταν διαβάζεις/γράφεις σε αρχείο κειμένου, θα πρέπει να καθορίσεις ακριβώς πως θα γίνει η μετατροπή και να μην βασιστείς στις επιλογές του χρήστη. Αν όχι τίποτε άλλο, το ίδιο αρχείο μπορεί να το στείλεις σε κάποιον με διαφορετικό Locale από το μηχάνημα σου. Τί θα γίνει σε αυτή την περίπτωση?
      Ο καλύτερος τρόπος να το κάνεις αυτό είναι να χρησιμοποιείς το InvariantCulture όταν γράφεις σε αρχεία ή όταν κάνεις μετατροπές π.χ. με την String.Format
    • Όταν διαβάζεις αριθμητικά δεδομένα από μία φόρμα θα πρέπει να έχεις υπόψη ότι ο χρήστης μπορεί να έχει ξεχάσει ποιό locale έχει ορίσει και να αρχίσει να εισάγει δεδομένα με λάθος υποδιαστολή. Μπορεί το κείμενο που θα δώσει να μετατρέπεται όντως σε αριθμό, απλά όχι αυτόν που περίμενε ο χρήστης.
      Όταν διαβάζεις/γράφεις σε φόρμα θα πρέπει να έχεις υπόψη ότι άλλο το Culture που χρησιμοποιείται για το UI και άλλο το Culture με το οποίο τρέχει το πρόγραμμα (για την ακρίβεια, το thread). Σκέψου ότι οι περισσότεροι προγραμματιστές μπορεί να έχουν ορίσει ελληνικό user locale αλλά προτιμούν πάντα τα αγγλικά ως Display Language. Αν εκτελέσεις πχ. ένα Double.ToString(), η τιμή θα μετατραπεί χρησιμοποιώντας τη γλώσσα που ορίζεται από το thread. 
      Το UI Culture χρησιμοποιείται για να εμφανιστούν τα κατάλληλα resources στο χρήστη ( strings, menus κλπ). Το Culture του Thread  θα το βρεις από το CultureInfo.CurrentCulture. Το Culture του UI από το CultureInfo.CurrentUICulture
    Εδώ κολλάει και το "σχεδόν" που ανέφερα παραπάνω. Ένας τρόπος να αντιμετωπίσεις το τελευταίο πρόβλημα είναι να χρησιμοποιήσεις κάποιο Masked text box για να εμποδίσεις το χρήστη να δώσει λάθος υποδιαστολή. Μία άλλη λύση είναι μόλις ο χρήστης πάει σε άλλο πεδίο, να φορμάρεις τον αριθμό με βάση το CurrentCulture για να δει αμέσως ότι υπάρχει πρόβλημα. Και μία τρίτη λύση είναι να επιτρέψεις μόνο την εισαγωγή του NumberDecimalSeparator, ειδοποιώντας το χρήστη αν δώσει κατά λάθος το σύμβολο των χιλιάδων. Αυτό μπορείς να το πετύχεις π.χ. στο KeyDown ή στο KeyPress event, θέτωντας το KeyEventArgs.Handled property σε true.

    Και για να κάνουμε τα πράγματα ακόμα πιο "ενδιαφέροντα", η τελεία του αριθμητικού πληκτρολογίου στέλνει πάντα την υποδιαστολή της γλώσσας του πληκτρολογίου που χρησιμοποιεί εκείνη τη στιγμή ο χρήστης. Γράφοντας ελληνικά, το αριθμητικό "." θα δώσει , ενώ γράφοντας αγγλικά θα δώσει . .  

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  31-01-2012, 01:00 69080 σε απάντηση της 69077

    Απ: Πρόβλημα με υποδιαστολή

    Ευχαριστώ πολύ και τους 2.


    Δεν τίθεται θέμα εισαγωγής δεδομένων απο τον χρήστη απευθείας στο πρόγραμμα, οπότε χρησιμοποίησα τη λύση του Rayden και δουλεύει τέλεια.

    Τα δεδομένα βγαίνουν απο matlab, spss και τέτοια προγράμματα, αλλά και χρήστης να τα γράψει, γνωρίζει ότι η υποδιαστολή θα είναι πάντα με τελεία (.)

    Το θέμα μου ήταν να μετατρέψω την τελεία σε ότι θέλει το μηχάνημα.


    Παρόλαυτα όμως, σίγουρα θα χρειαστώ κάποια στιγμή και για απευθείας πληκτρολόγηση σε κάποιο πρόγραμμα, οπότε θα κοιτάξω και τον δεύτερο τρόπο.


Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems